package com.liuzheng.ui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class GameJFrame extends JFrame implements KeyListener,ActionListener{
    //图片地址集合
    List<String> imageList;
    List<String> compareList;
    //空白格角标
    int blackIndex;
    //步数
    int stepCount;
    //创建菜单项
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reLoginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");
    //主界面
    public GameJFrame(){
        initJFrame();
        initJMenu();
        initImage(imageList);
        this.setVisible(true);
    }

    private void initImage(List<String> list) {
        //清空所有图片
        this.getContentPane().removeAll();
        JLabel stepBox = new JLabel("步数："+ stepCount);
        stepBox.setBounds(10,10,100,20);
        this.getContentPane().add(stepBox);
        for (int i = 0; i < list.size(); i++) {
            imagePosition(list.get(i),i);
            if(Objects.equals(list.get(i), "")){
                blackIndex = i;
            }
        }
        //刷新容器
        this.getContentPane().repaint();
        boolean flag = isSuccess();
        System.out.println("flag:"+flag);
        if(flag){
            JOptionPane.showMessageDialog(this,"恭喜你，游戏完成！");
            System.out.println("游戏完成");
        }
    }

    //获取图片路径返回一个集合
    private List<String> getAllImagePaths(String directory) {
        List<String> imagePaths = new ArrayList<>();
        File dir = new File(directory);
        //isDirectory()方法用于判断File对象是否是一个目录
        if (dir.exists() && dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        // 递归处理子目录
                        imagePaths.addAll(getAllImagePaths(file.getAbsolutePath()));
                    } else {
                        String fileName = file.getName().toLowerCase();
                        if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) {
                            imagePaths.add(file.getAbsolutePath());
                        }
                    }
                }
            }
        }
        //添加一张空白图片
        imagePaths.add("");
        // 对图片路径进行排序
        //imagePaths.sort(String::compareTo);
        //打乱图片路径
        java.util.Collections.shuffle(imagePaths);
        return imagePaths;
    }

    //初始化图片位置
    private void imagePosition(String pathname, int index) {
        ImageIcon icon = new ImageIcon(pathname);
        //设置图片大小
        icon.setImage(icon.getImage().getScaledInstance(105,105, Image.SCALE_DEFAULT));
        //创建 JLabel 组件
        JLabel jLabel = new JLabel(icon);
        //设置图片位置
        int xPoint = (index%4)*105;
        int yPoint = (index/4)*105;
        jLabel.setBounds(xPoint+10,yPoint+30,105,105);
        //将 JLabel 组件添加到主界面
        this.getContentPane().add(jLabel);
    }

    //初始化菜单
    private void initJMenu() {
        //初始化菜单
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单
        JMenu jMenu = new JMenu("功能");

        //将菜单添加到菜单栏
        jMenu.add(replayItem);
        jMenu.add(reLoginItem);
        jMenu.add(closeItem);
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        // 将菜单添加到菜单栏
        jMenuBar.add(jMenu);
        //将菜单栏添加到主界面
        this.setJMenuBar(jMenuBar);
    }

    //初始化主界面
    private void initJFrame() {
        this.setSize(440,520);
        //设置界面标题
        this.setTitle("拼图游戏v1.0 ");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认居中放置
        this.setLayout(null);
        this.addKeyListener(this);
        //初始化图片
        //绝对路径： 从磁盘的根目录开始，到目标文件的完整路径
        //相对路径： 相对于当前工作目录的路径，通常使用 . 或 .. 来表示当前目录或父目录，起点从模块名开始
        imageList = getAllImagePaths("15StepDemo/image");
        compareList = getAllImagePaths("15StepDemo/image");
        compareList.sort(String::compareTo);
        swap(compareList);
    }

    //重构 imageList
    private void refactoringList(boolean flag,int step){
        if(flag){
            imageList.set(blackIndex,imageList.get(blackIndex+step));
            imageList.set(blackIndex+step,"");
            stepCount++;
            initImage(imageList);
        }
    }

    //判断是否完成图片排序
    private boolean isSuccess(){
        boolean flag = true;
        for (int i = 0; i < imageList.size(); i++) {
            if (!imageList.get(i).equals(compareList.get(i))) {
                flag = false;
                break;
            }
        }
        return flag;
    }
    //交换收尾元素
    private void swap(List<String> list){
        String first = list.getFirst();
        list.removeFirst();
        list.addLast(first);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 38){
            System.out.println("向上移动");
            refactoringList(blackIndex <= 11,4);
        } else if (code == 40){
            System.out.println("向下移动");
            refactoringList(blackIndex>3,-4);
        } else if (code == 37) {
            System.out.println("向左移动");
            refactoringList((blackIndex+1)%4 != 0,1);
        } else {
            System.out.println("向右移动");
            refactoringList(blackIndex%4 != 0,-1);
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //按 W 一键完成图片排序
        int code = e.getKeyCode();
        System.out.println(code);
        if(code ==87){
            imageList.sort(String::compareTo);
            swap(imageList);
            initImage(imageList);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == replayItem){
            System.out.println("重新游戏");
            //打乱图片路径
            java.util.Collections.shuffle(imageList);
            //初始化步数
            stepCount = 0;
            initImage(imageList);
        }else if (e.getSource() == reLoginItem){
            System.out.println("重新登录");
            //关闭当前窗口
            this.setVisible(false);
            new LoginJFrame();
        }  else if (e.getSource() == closeItem){
            System.out.println("关闭游戏");
            //直接关闭虚拟机
            System.exit(0);
        }
    }
}
